package plp.orientadaObjetos2.comando;

import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
import plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
import plp.orientadaObjetos1.expressao.Expressao;
import plp.orientadaObjetos1.expressao.ListaExpressao;
import plp.orientadaObjetos1.expressao.leftExpression.Id;
import plp.orientadaObjetos1.expressao.valor.ValorRef;
import plp.orientadaObjetos1.expressao.valor.ValorString;
import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1;
import plp.orientadaObjetos1.memoria.Objeto;
import plp.orientadaObjetos2.memoria.AmbienteExecucaoOO2;
import plp.orientadaObjetos2.reflection.ReflectionUtil;

public class GetMetodoHandler extends AbstractComandoHandler {

	@Override
	public boolean aceita(Expressao comando) {
		boolean retorno = false;
		if (comando.toString().equals("getMetodo"))
			retorno = true;
		
		return retorno;
	}

	@Override
	public void manipula(ComandoBean comandoBean) throws ClasseNaoDeclaradaException,
			VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
			ObjetoNaoDeclaradoException, ClasseJaDeclaradaException,
			ObjetoJaDeclaradoException, ProcedimentoNaoDeclaradoException,
			ProcedimentoJaDeclaradoException, EntradaInvalidaException {
		
		Id nomeClasse = new Id("nome_metodo");
    	Id av = new Id(comandoBean.getParametrosReais().getHead().toString());
    	Id classe = new Id("Metodo");
    	
    	Id nomeMetodo = new Id("nomes_metodos");
    	ValorString valor = new ValorString(comandoBean.getObjeto().getEstado().get(nomeMetodo).toString());
    	ListaExpressao parametrosReaisx = new ListaExpressao(valor);
    	
    	
    	NewOO2 obj;
    	if (ReflectionUtil.isMetaClasse(classe)){
    		obj = new NewOO2Reflection(av, classe, parametrosReaisx);
    	} else{
    		obj = new NewOO2Padrao(av, classe, parametrosReaisx);
    	}
    	
    	obj.executar((AmbienteExecucaoOO2)comandoBean.getAmbiente());
		
	}

}
